home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / sound / scope_xt4 / src / scope_xt4.s < prev    next >
Text File  |  1999-05-14  |  24KB  |  1,450 lines

  1.  
  2. ;
  3. ;
  4. ;-------------------------------
  5. ;
  6. ; scope_xt4 by Smack/Infect!
  7. ;
  8. ;-------------------------------
  9. ;
  10. ;use ASM-One to assemble this code
  11. ;enable CPU 68020 and FPU
  12. ;
  13. ;
  14.  
  15.  
  16.     incdir    hd2:scope_xt4/src/
  17.  
  18.     include    os_macros.i
  19.     include    hardware-registers.i
  20.  
  21.  
  22.  
  23.     section    code,code
  24. ;---DOSLIBRARY-----------------------------------
  25.     move.l    (4).w,a6
  26.     move.l    (378,a6),a0    ;LibList
  27.     lea    (dosname,pc),a1
  28.     CALL    FindName
  29.     move.l    d0,(dosbase)
  30.     move.l    d0,a6
  31.     CALL    OutPut
  32.     move.l    d0,a5
  33.     move.l    a5,d1
  34.     move.l    #titletxt,d2
  35.     moveq    #titletxt_end-titletxt,d3
  36.     CALL    Write
  37. ;---CPU FPU CHECK--------------------------------
  38.     move.l    (4).w,a0
  39.     btst    #4,(297,a0)    ;ATTN_Flags(+1)  68881
  40.     bne.b    .fpuok
  41.  
  42.     move.l    a5,d1
  43.     move.l    #nofputxt,d2
  44.     move.l    #nofputxt_end-nofputxt,d3
  45.     CALL    Write
  46.     moveq    #10,d0
  47.     rts
  48. .fpuok
  49.     move.l    a5,d1
  50.     move.l    #precalctxt1,d2
  51.     move.l    #precalctxt1_end-precalctxt1,d3
  52.     CALL    Write
  53.  
  54.     bsr    fft_init
  55.  
  56.     move.l    a5,d1
  57.     move.l    #precalctxt2,d2
  58.     move.l    #precalctxt2_end-precalctxt2,d3
  59.     CALL    Write
  60.  
  61.     moveq    #50,d1
  62.     CALL    Delay
  63.  
  64.     include    startup_nocheck.i    ;jumps to 'main'
  65.     include    dummysprites.i
  66.  
  67.  
  68. ;-------------------------------
  69.  
  70. dosname    dc.b    "dos.library",0
  71. dosbase    dc.l    0
  72.     dc.b    "$VER: SCOPE_XT4 1.00 (Sat 01-May-99)",10,0
  73. titletxt
  74.     dc.b    27,"[1mSCOPE_XT4 by Smack/Infect! (Sat 01-May-99)",27,"[0m",10,0
  75. titletxt_end
  76. nofputxt
  77.     dc.b    "no FPU found - sorry.",10,0
  78. nofputxt_end
  79. precalctxt1
  80.     dc.b    "precalculating table ...",0
  81. precalctxt1_end
  82. precalctxt2
  83.     dc.b    " ready.",10,0
  84. precalctxt2_end
  85.     even
  86.  
  87.  
  88.  
  89.  
  90. main
  91. ;---INIT COPPERLISTS-----------------------------
  92.     lea    (cl1),a0
  93.     bsr    dummysprites
  94.     lea    (cl3),a0
  95.     bsr    dummysprites
  96.  
  97.     lea    (cl1pt+8+2),a0
  98.     move.l    #wave_screen,d0
  99.     move    d0,(4,a0)
  100.     swap    d0
  101.     move    d0,(a0)
  102.  
  103.     lea    (cl2pt+8+2),a0
  104.     move.l    #spectrum_screen_full1,d0
  105.     move    d0,(4,a0)
  106.     swap    d0
  107.     move    d0,(a0)
  108.  
  109.     lea    (cl3pt2+2),a0
  110.     move.l    #spectrum_screen_tb1,d0
  111.     move    d0,(4,a0)
  112.     swap    d0
  113.     move    d0,(a0)
  114.  
  115.     lea    (cl1+2),a0
  116.     lea    (cl3+2),a1
  117.     move.l    #function_panel,d0
  118.     move.l    d0,a5
  119.     move    d0,(4,a0)
  120.     move    d0,(4,a1)
  121.     swap    d0
  122.     move    d0,(a0)
  123.     move    d0,(a1)
  124.     move    #(48<<8)+$bf,(a5)
  125.     move    #((48-16)<<8)+$02,(64/8,a5)
  126.  
  127. ;---INIT AUDIO TIMING----------------------------
  128.     lea    ($dff000),a5
  129.     move    #1,(aud0per,a5)
  130.     move    #1,(aud1per,a5)
  131.     move    #140/2,(aud2per,a5)
  132.     move    #1,(aud2len,a5)
  133.     move    #64,(aud0vol,a5)
  134.     move    #64,(aud1vol,a5)
  135.     move    #0,(aud2vol,a5)
  136.     move    #0,(aud3vol,a5)
  137.  
  138. ;---INIT PARALLEL PORT---------------------------
  139.     lea    ($bfd000),a1
  140.     move.b    #6,($200,a1)        ;DDRA SEL and POUT output
  141.     move.b    #0,($1301,a1)        ;DDRB PRB input
  142.     move.b    #2,(a1)            ;PRA  POUT signal
  143.     or.b    #2,($1001,a1)        ;FILTER OFF
  144.  
  145. ;---INIT IRQ & DMA-------------------------------
  146.     move.l    (smppt0,pc),a6
  147.     move.l    (mainvbr,pc),a0
  148.     move.l    ($70,a0),(oldlevel4)
  149.     move.l    #sample_interrupt_nosound,($70,a0)
  150.     move.l    #frame_interrupt,($6c,a0)
  151.     move.l    #key_interrupt,($68,a0)
  152.     move    #$7fff,(adkcon,a5)
  153.     move.l    #cl1,(cop1lch,a5)
  154.     move    #1,(copjmp1,a5)
  155.     move    #$83a4,(dmacon,a5)    ;bpl+cop+spr+aud2
  156.     move    #$c228,(intena,a5)    ;audio2+vblank+level2
  157.     move    #0,(bplcon3,a5)
  158.  
  159.  
  160.  
  161. main_loop
  162.     bsr.b    check_keyboard
  163.     cmp.b    #$59,(keytaste)        ** F10 down
  164.     beq.b    .dont
  165.  
  166. ;---DO THE REAL STUFF----------------------------
  167.     bsr    prepare_sample
  168.     move    (plot_mode,pc),d0
  169.     bne.b    .not_wave
  170.     bsr    plot_wave_spectrum
  171.     bra.b    .dont
  172. .not_wave
  173.     bsr    plot_fft8
  174.  
  175. .dont    clr    (ready)
  176.     cmp.b    #$58,(keytaste)        ** F9 down
  177.     bne.b    .ww0
  178. .ww1    move    ($dff006),($dff180)
  179.     tst    (ready)
  180.     beq.b    .ww1
  181.     bra.b    main_loop
  182. .ww0    tst    (ready)
  183.     beq.b    .ww0
  184.  
  185.     cmp.b    #$c5,(keytaste)        ** ESC up
  186.     bne.b    main_loop
  187.  
  188. ;    tst.b    (keytaste)
  189. ;    beq.b    main_loop
  190.  
  191.  
  192.     move    #$7fff,($dff000+intena)
  193.     move.l    (mainvbr,pc),a0
  194.     move.l    (oldlevel4,pc),($70,a0)
  195.     rts
  196.  
  197.  
  198.  
  199.  
  200. *********************************************************
  201. ***** A6 register forbidden to use (sample pointer) *****
  202. *********************************************************
  203.  
  204. ;-------------------------------
  205.  
  206. check_keyboard
  207.     move.b    (keytaste,pc),d0
  208.     cmp.b    #$50,d0            ** F1 down
  209.     bne.b    .not_f1
  210.     clr    (plot_mode)
  211.     move.l    #cl1,($dff000+cop1lch)
  212.     bra    panel_screenmode
  213. .not_f1
  214.     cmp.b    #$51,d0            ** F2 down
  215.     bne.b    .not_f2
  216.     move    #-1,(plot_mode)
  217.     move.l    #cl3,($dff000+cop1lch)
  218.     bsr    init_gray_palette
  219.     bra    panel_screenmode
  220. .not_f2
  221.     cmp.b    #$53,d0            ** F4 down
  222.     bne.b    .not_f4
  223.     clr.b    (keytaste)
  224.     not    (wave_off)
  225.     bne.b    .f4
  226.     rts
  227. .f4    move.l    (wave_pt0,pc),a5
  228.     bsr    clear_wave
  229.     move.l    (wave_pt1,pc),a5
  230.     bra    clear_wave
  231. .not_f4
  232.     cmp.b    #$54,d0            ** F5 down
  233.     bne.b    .not_f5
  234.     clr.b    (keytaste)
  235.     not    (spec_off)
  236.     bne.b    .f5
  237.     rts
  238. .f5    move.l    (spec_pt0,pc),a5
  239.     bsr    clear_spectrum
  240.     move.l    (spec_pt1,pc),a5
  241.     bra    clear_spectrum
  242. .not_f5
  243.     cmp.b    #8,d0            ** 8 down
  244.     bne.b    .not_8
  245.     clr.b    (keytaste)
  246.     move.l    #smpbuf0,a0
  247.     move.l    a0,a6
  248.     move.l    a0,(smppt0)
  249.     move.l    #smpbuf1,(smppt1)
  250.     move.l    (mainvbr,pc),a0
  251.     move.l    #sample_interrupt,($70,a0)
  252.     bra    panel_audio
  253. .not_8
  254.     cmp.b    #9,d0            ** 9 down
  255.     bne.b    .not_9
  256.     clr.b    (keytaste)
  257.     move.l    #smpbuf0,a0
  258.     move.l    a0,a6
  259.     move.l    a0,(smppt0)
  260.     move.l    #smpbuf1,(smppt1)
  261.     move.l    (mainvbr,pc),a0
  262.     move.l    #sample_interrupt_nosound,($70,a0)
  263.     bra    panel_audio
  264. .not_9
  265.     cmp.b    #$46,d0            ** Del down
  266.     bne.b    .not_del
  267.     clr.b    (keytaste)
  268.     move.l    (smpmode_pt,pc),a1
  269.     move.l    (a1)+,d0
  270.     move.l    (a1)+,a0
  271.     move.l    a0,a6
  272.     move.l    a0,(smppt0)
  273.     move.l    (a1)+,(smppt1)
  274.     move.l    (mainvbr,pc),a0
  275.     move.l    d0,($70,a0)
  276.     cmp.l    #smpmode_end,a1
  277.     bne.b    .del_ok
  278.     lea    (smpmode_1,pc),a1
  279. .del_ok    move.l    a1,(smpmode_pt)
  280.     bra    panel_audio
  281. .not_del
  282.     cmp.b    #1,d0            ** 1 down
  283.     bne.b    .not_1
  284.     move    #1,(subsampling)
  285.     move.l    #spectrum_screen_full1,d1
  286.     move    d1,(cl2pt+10+4)
  287.     swap    d1
  288.     move    d1,(cl2pt+10)
  289.     move.l    #spectrum_screen_tb1,d1
  290.     move    d1,(cl3pt2+6)
  291.     swap    d1
  292.     move    d1,(cl3pt2+2)
  293.     bra    panel_freq
  294. .not_1
  295.     cmp.b    #2,d0            ** 2 down
  296.     bne.b    .not_2
  297.     move    #2,(subsampling)
  298.     move.l    #spectrum_screen_full2,d1
  299.     move    d1,(cl2pt+10+4)
  300.     swap    d1
  301.     move    d1,(cl2pt+10)
  302.     move.l    #spectrum_screen_tb2,d1
  303.     move    d1,(cl3pt2+6)
  304.     swap    d1
  305.     move    d1,(cl3pt2+2)
  306.     bra    panel_freq
  307. .not_2
  308.     cmp.b    #3,d0            ** 3 down
  309.     bne.b    .not_3
  310.     move    #3,(subsampling)
  311.     move.l    #spectrum_screen_full3,d1
  312.     move    d1,(cl2pt+10+4)
  313.     swap    d1
  314.     move    d1,(cl2pt+10)
  315.     move.l    #spectrum_screen_tb3,d1
  316.     move    d1,(cl3pt2+6)
  317.     swap    d1
  318.     move    d1,(cl3pt2+2)
  319.     bra    panel_freq
  320. .not_3
  321.     cmp.b    #$10,d0            ** q down
  322.     bne.b    .not_q
  323.     move.l    #window_rectangle,(fft_window_pt)
  324.     bra    panel_window
  325. .not_q
  326.     cmp.b    #$11,d0            ** w down
  327.     bne.b    .not_w
  328.     move.l    #window_hamming,(fft_window_pt)
  329.     bra    panel_window
  330. .not_w
  331.     cmp.b    #$12,d0            ** e down
  332.     bne.b    .not_e
  333.     move.l    #window_hanning,(fft_window_pt)
  334.     bra    panel_window
  335. .not_e
  336.     cmp.b    #$13,d0            ** r down
  337.     bne.b    .not_r
  338.     move.l    #window_triangle,(fft_window_pt)
  339.     bra    panel_window
  340. .not_r
  341.     cmp.b    #$14,d0            ** t down
  342.     bne.b    .not_t
  343.     move.l    #window_blackman,(fft_window_pt)
  344.     bra    panel_window
  345. .not_t
  346.     cmp.b    #$20,d0            ** a down
  347.     bne.b    .not_a
  348.     subq.l    #1,(fft_logscale)
  349.     bra    panel_intensity
  350. .not_a
  351.     cmp.b    #$21,d0            ** s down
  352.     bne.b    .not_s
  353.     clr.l    (fft_logscale)
  354.     bra    panel_intensity
  355. .not_s
  356.     rts
  357.  
  358.  
  359.  
  360.  
  361.  
  362.  
  363. ;-------------------------------
  364. panel_screenmode
  365.     lea    (.hilighted,pc),a5
  366.     move.l    (a5),a0
  367.     moveq    #7-1,d7
  368. .loop1    not.l    (a0)+
  369.     not.l    (a0)+
  370.     addq.l    #8,a0
  371.     dbf    d7,.loop1
  372.     lea    (function_panel),a0
  373.     move    (plot_mode,pc),d0
  374.     bne.b    .not_osc
  375.     add    #128/8*(1+13),a0
  376.     bra.b    .new
  377. .not_osc
  378.     add    #128/8*(1+34),a0
  379. .new
  380.     move.l    a0,(a5)
  381.     moveq    #7-1,d7
  382. .loop2    not.l    (a0)+
  383.     not.l    (a0)+
  384.     addq.l    #8,a0
  385.     dbf    d7,.loop2
  386.     rts
  387. .hilighted    dc.l    function_panel+128/8*(1+13)
  388.  
  389.  
  390. ;-------------------------------
  391. panel_window
  392.     lea    (.hilighted,pc),a5
  393.     moveq    #10,d6
  394.     move.l    (a5),a0
  395.     moveq    #7-1,d7
  396. .loop1    not    (a0)+
  397.     not.l    (a0)+
  398.     add.l    d6,a0        ;#10
  399.     dbf    d7,.loop1
  400.  
  401.     lea    (function_panel),a0
  402.     move.l    (fft_window_pt,pc),d0
  403.     cmp.l    #window_rectangle,d0
  404.     bne.b    .not_rect
  405.     add    #128/8*(1+53)+2,a0
  406.     bra.b    .new
  407. .not_rect
  408.     cmp.l    #window_hamming,d0
  409.     bne.b    .not_hamm
  410.     add    #128/8*(1+64)+2,a0
  411.     bra.b    .new
  412. .not_hamm
  413.     cmp.l    #window_hanning,d0
  414.     bne.b    .not_hann
  415.     add    #128/8*(1+75)+2,a0
  416.     bra.b    .new
  417. .not_hann
  418.     cmp.l    #window_triangle,d0
  419.     bne.b    .not_tria
  420.     add    #128/8*(1+86)+2,a0
  421.     bra.b    .new
  422. .not_tria
  423.     add    #128/8*(1+97)+2,a0
  424.  
  425. .new
  426.     move.l    a0,(a5)
  427.     moveq    #7-1,d7
  428. .loop2    not    (a0)+
  429.     not.l    (a0)+
  430.     add.l    d6,a0        ;#10
  431.     dbf    d7,.loop2
  432.     rts
  433. .hilighted    dc.l    function_panel+128/8*(1+75)+2
  434.  
  435.  
  436. ;-------------------------------
  437. panel_freq
  438.     lea    (.hilighted,pc),a5
  439.     moveq    #10,d6
  440.     move.l    (a5),a0
  441.     moveq    #7-1,d7
  442. .loop1    not    (a0)+
  443.     not.l    (a0)+
  444.     add.l    d6,a0        ;#10
  445.     dbf    d7,.loop1
  446.  
  447.     lea    (function_panel),a0
  448.     move    (subsampling,pc),d0
  449.     su